package com.example.object_oriented.polymorphic;

/**
 *
 * 多态是同一个行为具有多个不同表现形式或形态的能力。
 * 多态就是同一个接口，使用不同的实例而执行不同操作，如图所示：
 * @author readpage
 * @date 2023-01-05 11:59
 */

abstract class Animal {
    abstract void eat();
}

class Cat extends Animal {
    @Override
    void eat() {
        System.out.println("吃鱼");
    }

    void work() {
        System.out.println("抓老鼠");
    }
}

class Dog extends Animal {

    @Override
    void eat() {
        System.out.println("吃骨头");
    }

    void work() {
        System.out.println("看家");
    }
}

public class Test {
    public static void show(Animal a) {
        a.eat();
        // 判断类型
        if (a instanceof Cat) { // 猫做的事情
            Cat c = (Cat)a;
            c.work();
        } else if (a instanceof Dog) { // 狗做的事情
            Dog d = (Dog)a;
            d.work();
        }
    }

    public static void main(String[] args) {
        show(new Cat()); // 以 Cat 对象调用 show 方法
        show(new Dog()); // 以 Dog 对象调用 show 方法

        Animal a = new Cat(); // 向上转型
        a.eat();    // 调用的是 Cat 的 eat
        Cat c = (Cat)a;  // 向下转型
        c.work(); // 调用的是 Cat 的 eat
    }
}
